CRDT-MCP AI Agent 동시 파일 편집 시스템
마지막 수정일: 2026. 03. 09.
1. 프로젝트 개요
무엇을 만드는가?
CRDT(Conflict-free Replicated Data Types)를 활용하여 여러 AI agent(Claude Code 등)가 같은 파일을 동시에 안전하게 편집할 수 있는 MCP(Model Context Protocol) 서버.
왜 만드는가?
현재 문제점:
- 현존하는 AI 코딩 도구(Claude Code, Cursor, Copilot 등)는 multi-agent가 같은 파일을 동시에 편집하면 last-write-wins 문제가 발생
- Agent A의 수정을 Agent B가 덮어쓰는 데이터 손실 위험
- 현재 업계 표준은 "파일 단위로 작업 분리" → 근본적 해결이 아닌 회피
- 단일 agent 순차 작업은 병렬 작업 대비 비효율적
해결 방안:
- CRDT를 통해 동시 편집 시 자동 충돌 해결
- MCP 서버로 제공하여 Claude Code 등 AI 도구에 플러그인 형태로 연결
- Agent별 편집 operation을 실시간 병합하여 일관된 파일 상태 유지
2. 시스템 아키텍처
전체 구조
┌──────────────┐ ┌──────────────┐
│ Claude Code │ │ Claude Code │
│ Agent A │ │ Agent B │
└──────┬───────┘ └──────┬───────┘
│ MCP (SSE/HTTP) │
└────────┬───────────┘
│
┌────────▼────────┐
│ MCP Server │
│ (CRDT Engine) │
│ │
│ - Yjs Doc │
│ - File I/O │
│ - Conflict │
│ Detection │
└────────┬────────┘
│
┌─────▼─────┐
│ File System│
└───────────┘
컴포넌트 설명
| 컴포넌트 | 역할 | 기술 |
|---|---|---|
| MCP Server | AI agent에게 편집 도구 제공, CRDT 상태 관리 | Node.js, @modelcontextprotocol/sdk |
| CRDT Engine | 동시 편집 병합, 충돌 해결 | Yjs |
| File Sync Layer | CRDT 상태 ↔ 실제 파일 동기화 | fs, chokidar |
| Conflict Detector | 의미적 충돌 감지 (선택) | AST 분석 |
| Web Dashboard | 실시간 편집 시각화 | 기존 웹 에디터 확장 |
MCP Transport 방식
SSE (Server-Sent Events) 방식 채택:
- MCP 서버를 하나 띄워두고, 여러 Claude Code 인스턴스가 같은 서버에 접속
- 별도 백엔드 불필요 — 로컬에서 도는 하나의 프로세스
- Claude Code 설정:
{
"mcpServers": {
"crdt-editor": {
"url": "http://localhost:3000/sse"
}
}
}
3. MCP Tool 설계
MCP 서버가 AI agent에게 제공하는 도구:
`crdt_open`
- 설명: 파일을 CRDT 문서로 로드 (이미 열려있으면 기존 세션에 합류)
- 입력:
{ file_path: string } - 출력:
{ session_id: string, content: string, active_agents: number }
`crdt_read`
- 설명: 현재 CRDT 문서 상태 읽기
- 입력:
{ file_path: string } - 출력:
{ content: string, version: number }
`crdt_edit`
- 설명: 파일 편집 (삽입/삭제/교체)
- 입력:
{ file_path: string, operations: [{ type: "insert"|"delete"|"replace", position: number, content?: string, length?: number }] } - 출력:
{ success: boolean, content: string, version: number }
`crdt_close`
- 설명: 편집 세션 종료 및 파일 저장
- 입력:
{ file_path: string } - 출력:
{ success: boolean }
`crdt_status`
- 설명: 현재 세션 상태 조회 (활성 agent 수, 최근 변경 등)
- 입력:
{ file_path: string } - 출력:
{ active_agents: number, last_modified: string, edit_history: [...] }
4. 차별화 기능 (캡스톤 가산점)
4-1. 의미적 충돌 감지
- CRDT는 텍스트 레벨 충돌만 해결
- 예: Agent A가 함수 삭제 + Agent B가 해당 함수 호출 코드 추가 → 텍스트는 병합되지만 코드는 깨짐
- AST 파싱을 통해 이런 논리적 충돌을 감지하고 agent에게 경고
4-2. 편집 히스토리 시각화
- 기존 웹 에디터를 확장하여 agent별 편집 내역을 색상으로 구분
- 타임라인 형태로 "누가 언제 어디를 수정했는지" 표시
5. 최종 데모 시나리오
데모 화면 구성
┌─────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ Terminal A │ │ Web Viewer │ │ Terminal B │ │
│ │ (Agent A) │ │ (실시간 뷰) │ │ (Agent B) │ │
│ │ │ │ │ │ │ │
│ │ Claude │ │ 편집 내용이 │ │ Claude │ │
│ │ Code │ │ 실시간으로 │ │ Code │ │
│ │ │ │ 합쳐지는 │ │ │ │
│ │ "로그인 │ │ 모습이 │ │ "회원가입 │ │
│ │ 기능 │ │ 보임 │ │ 기능 │ │
│ │ 추가해줘" │ │ │ │ 추가해줘"│ │
│ │ │ │ Agent A 색 │ │ │ │
│ │ │ │ Agent B 색 │ │ │ │
│ └─────────────┘ └──────────────┘ └────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
데모 시나리오
- 서버 시작:
node server.js→ MCP 서버 + 웹 대시보드 실행 - Agent A 접속: Claude Code 터미널에서
crdt_open("app.js")→ 세션 합류 - Agent B 접속: 다른 Claude Code 터미널에서 같은 파일 오픈 → 동시 접속 확인
- 동시 편집:
- Agent A에게: "이 파일에 로그인 기능 추가해줘"
- Agent B에게: "이 파일에 회원가입 기능 추가해줘"
- 실시간 병합: 가운데 웹 뷰어에서 두 agent의 편집이 실시간으로 합쳐지는 모습 시연
- 결과 확인: 최종 파일에 두 기능이 충돌 없이 공존, 실행하여 정상 동작 확인
데모 포인트
- "동시에 같은 파일을 편집해도 서로의 작업이 사라지지 않는다"
- "CRDT가 자동으로 병합하여 일관된 결과를 만들어낸다"
- "기존 도구에서는 불가능한 병렬 작업이 가능해진다"
6. 기술 스택 및 필요 사항
기술 스택
| 분류 | 기술 | 용도 |
|---|---|---|
| Runtime | Node.js | 서버 실행 |
| CRDT | Yjs | 동시 편집 병합 엔진 |
| MCP | @modelcontextprotocol/sdk | MCP 서버 구현 |
| Transport | SSE (HTTP) | Agent ↔ MCP 서버 통신 |
| Frontend | HTML/JS (기존 에디터 확장) | 실시간 시각화 대시보드 |
| File Watch | chokidar | 파일시스템 변경 감지 |
필요 사항
- Node.js 18+ 설치
- MCP SDK 설치 (
@modelcontextprotocol/sdk) - Claude Code Pro 계정 2개 (또는 동일 계정으로 터미널 2개)
- 데모용 샘플 프로젝트 파일 준비
프로젝트 구조 (예상)
crdt/
├── server.js # MCP 서버 (SSE transport)
├── crdt-engine.js # Yjs CRDT 엔진 래퍼
├── file-sync.js # CRDT ↔ 파일시스템 동기화
├── conflict-detector.js # 의미적 충돌 감지 (선택)
├── public/
│ └── index.html # 실시간 시각화 대시보드
├── package.json
└── PROJECT.md # 이 문서